﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace HitsInMin
{
    public partial class FormMain : Form
    {
        public FormMain()
        {
            InitializeComponent();
        }

        DateTime StartHit = DateTime.MinValue;
        DateTime EndHit = DateTime.MinValue;
        int cntHits;

        List<double> hitsInMinList = new List<double>(); // список последних значений ударов в минуту

        // разница в миллисекундах для зеленого статуса.
        double GreenDiff = 350;
        // разница в миллисекундахдля желтого статуса.
        double YellowDiff = 600;

        private void FormMain_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
        {
            if (e.KeyCode == Keys.Escape)
            {
                StartHit = DateTime.MinValue;
                EndHit = DateTime.MinValue;
                lblHits.Text = "--";
                lblHitsInMin.Text = "Нет";
                lblHitsInMin.ForeColor = Color.White;
                cntHits = 0;
            }

            if (e.KeyCode == Keys.Space)
            {
                if (StartHit == DateTime.MinValue)
                {
                    StartHit = DateTime.Now;
                    lblHits.Text = "**";
                    return;
                }

                cntHits++;

                DateTime lastHit = EndHit == DateTime.MinValue ? StartHit : EndHit;
                EndHit = DateTime.Now;

                // заполнение строки последних диапазонов между ударами
                double diff = 60000 / (EndHit - lastHit).TotalMilliseconds;
                lblHits.Text = diff.ToString("F0") + " " + lblHits.Text;

                // вычисление текущего значения ударов в минуту
                double hitsInMin = 60000 / ((EndHit - StartHit).TotalMilliseconds / (double)cntHits);
                lblHitsInMin.Text = hitsInMin.ToString("F0");

                // заполнение списка последних значений ударов в минуту
                hitsInMinList.Add(hitsInMin);

                // определение статуса
                Color actColor = Color.White;
                // если последние 3 удара число ударов в минуту не изменялось более чем на YellowDiff - желтый статус
                if (GetDiffValue(hitsInMinList, 3) < YellowDiff) actColor = Color.Yellow;
                // если последние 5 ударов число ударов в минуту не изменялось более чем на GreenDiff - зеленый статус
                if (GetDiffValue(hitsInMinList, 5) < GreenDiff) actColor = Color.Lime;

                // присвоение текущего цвета
                if (lblHitsInMin.ForeColor != actColor) lblHitsInMin.ForeColor = actColor;
            }

        }

        double GetDiffValue(List<double> dblList, int cntLastValues)
        {
            if (dblList.Count < cntLastValues) return double.MaxValue;

            double minVal = dblList[dblList.Count - 1];
            double maxVal = dblList[dblList.Count - 1];
            for (int i = (dblList.Count - cntLastValues); i < dblList.Count; i++)
            {
                if (minVal > dblList[i]) minVal = dblList[i];
                if (maxVal < dblList[i]) maxVal = dblList[i];
            }
            return (maxVal - minVal) * 1000.0;

        }

    }
}
